#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<assert.h>
using namespace std;

void hander(int signum)
{
    cout<<"捕捉二号信号,不要退出"<<endl;
}

static void showPending(sigset_t &pending)
{
    for(int sig = 1;sig <= 31;sig++)
    {
        if(sigismember(&pending,sig)) cout<<"1";
        else cout<<"0";
    }
    cout<<endl;
}

int main()
{
    signal(2,hander);
    //1，定义信号集对象
    sigset_t bset,obset;
    sigset_t pending;
    //2,初始化
    sigemptyset(&bset);
    sigemptyset(&obset);
    sigemptyset(&pending);
    //3,添加屏蔽信号
    sigaddset(&bset,2/*SIGINT*/);
    //4,设置set到内核中对应的进程内部[默认情况进程不会对任何信号进行black]
    int n = sigprocmask(SIG_BLOCK,&bset,&obset);
    assert(n == 0);
    (void) n;
    cout<<"black 2 信号成功"<<"pid : "<<getpid()<<endl;
    //5，重复打印pending信号集
    int count = 0;
    while (true)
    {
        //5,1获取当前进程pending信号集
        sigpending(&pending);
        //5,2显示pending信号集中的没有递达的信号
        showPending(pending);
        sleep(1);
        count++;
        if(count == 20) 
        {
            int n = sigprocmask(SIG_SETMASK,&obset,nullptr);
            assert(n == 0);
            (void) n;
            cout<<"解除2号信号的block"<<endl;
        }
    }
    
    return 0;
}















// void catchSig(int signum)
// {
//     cout<<"获得了一个信号"<<signum<<endl;
// }
// int main()
// {

//     for(int i = 1;i<=31;i++) signal(i,catchSig);

//     while (true)
//     {
//         sleep(1);
//     }
    
//     // signal(2,SIG_DFL);//SIG_DFL 默认 0
//     // signal(2,SIG_IGN);//SIG_IGN 忽略 1
//     return 0;
// }